import { forParent } from './sendData'
import store from '@jsjn/micro-core-store'
import _ from 'lodash'

type ToPageParams =
    // 简单的
    | string
    | {
          // 带查询参数，结果是 /register?plan=private
          type?: 'push' | 'replace'
          path: string
          query?: {
              [k: string]: any
          }
      }
    | {
          // 命名的路由，并加上参数，让路由建立 url
          type?: 'push' | 'replace'
          name: string
          query?: {
              [k: string]: any
          }
      }

/**
 * 跳转委托
 * 子应用跳转，抛到基座应用中，由基座应用负责跳转
 * 基座应用会分发到具体的微应用
 *
 * 子应用跳转页面分为三种情况
 * - 字符串，默认采用 push 跳转
 * - 对象，指明 type，使用对应的 type 跳转
 * - 对象，未指明type，默认使用 push
 * @param params 跳转参数
 * @param onlyKey 重复路径查找关键字
 */
export function toPage(params: ToPageParams, onlyKey?: string) {
    let fullParams = params

    // 是否传递了 onlyKey
    if (onlyKey) {
        const allRoutes = store.state.appFuncTree.remoteRegisteredRoutes

        // 字符串
        if (_.isString(params)) {
            const target = allRoutes.find((route) => {
                return (
                    route.path.includes(params) &&
                    route.meta.urlQuery &&
                    route.meta.urlQuery.includes(`onlyKey=${onlyKey}`)
                )
            })
            target && (fullParams = target.path)
        }

        // 对象
        if (_.isObject(params)) {
            // path 跳转
            if ((params as any).path) {
                const target = allRoutes.find((route) => {
                    return (
                        route.path.includes((params as any).path) &&
                        route.meta.urlQuery &&
                        route.meta.urlQuery.includes(`onlyKey=${onlyKey}`)
                    )
                })

                target && ((fullParams as any).path = target.path)
            }

            // name 跳转
            if ((params as any).name) {
                const target = allRoutes.find((route) => {
                    return (
                        (route.name as string).includes((params as any).name) &&
                        route.meta.urlQuery &&
                        route.meta.urlQuery.includes(`onlyKey=${onlyKey}`)
                    )
                })

                target && ((fullParams as any).name = target.name)
            }
        }
    }

    forParent({
        toPage: fullParams
    })
}

export type ToComponentToInfo =
    | string
    | {
          path: string
          query?: {
              [k: string]: any
          }
      }
    | {
          name: string
          query?: {
              [k: string]: any
          }
      }

/**
 * 向下通信（暂时没有需求）
 * @param name 应用名称
 * @param to 路由
 * @returns
 */
export function toComponent(name: string, to: ToComponentToInfo) {
    if (!name) return
}

/**
 * iframe 主动激活链接
 * 常用于：
 *  - 帆软报表
 */
export function activateIframe(params: { title?: string; href: string; isStatement?: boolean }) {
    forParent({
        activateIframe: params
    })
}

/**
 * 关闭当前页面
 * @param noNav 第三方关闭标签页时，有可能不需要执行路由跳转，由用户决定后续跳转
 */
export function closeCurrentPage(noNav: boolean = false) {
    forParent({
        closeCurrentPage: noNav
    })
}

/**
 * 关闭指定页
 * @param params
 */
export function closeTargetPage(params: { noNav?: boolean; targetPath: string }) {
    if (!params.targetPath) return
    forParent({
        closeTargetPage: params
    })
}
